'''



进程和线程的关系：

进程和线程是多任务编程中的两个基本概念，它们在操作系统中的角色和功能有所不同。以下是它们的主要关系和区别：

1. 定义：
   - 进程：进程是操作系统分配资源的基本单位，每个进程都有独立的内存空间和系统资源。一个进程可以包含多个线程。
   - 线程：线程是进程中的一个执行单元，是CPU调度和执行的基本单位。线程共享进程的内存空间和资源。

2. 资源占用：
   - 进程：进程拥有独立的内存空间，因此创建和销毁进程的开销较大，且进程间的通信较为复杂。
   - 线程：线程共享进程的内存空间，因此创建和销毁线程的开销较小，且线程间的通信较为简单。

3. 并发性：
   - 进程：进程之间是相互独立的，一个进程的崩溃不会影响其他进程。
   - 线程：线程之间共享进程的资源，一个线程的崩溃可能会影响整个进程。

4. 适用场景：
   - 进程：适用于需要高度隔离的任务，如不同的应用程序。
   - 线程：适用于需要共享数据和资源的高并发任务，如Web服务器的请求处理。

5. 通信方式：
   - 进程：进程间通信（IPC）通常通过管道、消息队列、共享内存等方式进行。
   - 线程：线程间通信可以直接通过共享内存进行，但需要同步机制（如锁）来避免竞争条件。

6. 创建和销毁：
   - 进程：创建和销毁进程的开销较大，因为需要分配和回收独立的资源。
   - 线程：创建和销毁线程的开销较小，因为共享进程的资源。

总结来说，进程是资源分配的基本单位，而线程是CPU调度的基本单位。进程之间相互独立，线程之间共享资源。选择使用进程还是线程取决于具体的应用场景和需求。


进程的状态：
进程的状态是指进程在操作系统中的不同状态。以下是进程的主要状态：
1. 就绪状态（Ready）：
   - 进程已经准备好执行，但尚未分配CPU。
   - 进程等待CPU的调度。
2. 运行状态（Running）：
   - 进程正在CPU上执行。
   - 进程正在执行其代码。
3. 阻塞状态（Blocked）：
   - 进程暂时无法执行，因为它正在等待某个事件的发生。
   - 进程可能正在等待I/O操作、信号量等。
4. 终止状态（Terminated）：
   - 进程已经完成执行或被终止。
   - 进程的所有资源已经被释放。
5. 挂起状态（Suspended）：
   - 进程暂时停止执行，等待恢复执行。
   - 进程可能被挂起到磁盘上，以便稍后恢复执行。


进程的状态转换：
进程的状态转换是指进程从一个状态转换到另一个状态的过程。以下是进程的主要状态转换：
1. 就绪状态到运行状态：
   - 进程从就绪状态转换到运行状态，当CPU分配给进程时。
2. 运行状态到就绪状态：
   - 进程从运行状态转换到就绪状态，当进程等待I/O操作、信号量等事件的发生时。
3. 运行状态到阻塞状态：
   - 进程从运行状态转换到阻塞状态，当进程等待I/O操作、信号量等事件的发生时。
4. 阻塞状态到就绪状态：
   - 进程从阻塞状态转换到就绪状态，当I/O操作、信号量等事件发生时。
5. 运行状态到终止状态：
   - 进程从运行状态转换到终止状态，当进程完成执行或被终止时。
6. 就绪状态到挂起状态：
   - 进程从就绪状态转换到挂起状态，当进程被挂起到磁盘上时。
7. 挂起状态到就绪状态：
   - 进程从挂起状态转换到就绪状态，当进程从磁盘上恢复执行时。
进程的状态转换是进程在操作系统中的重要概念，它决定了进程的执行流程和资源分配。不同的操作系统可能有不同的进程状态和状态转换规则。


'''

import multiprocessing
from time import sleep
from multiprocessing import Process, Pipe
import os




def worker_function(name, pipe):
    print(f"进程 {name} 正在执行")
    sleep(20)
    pipe.send("Hello from process " + name)



def worker_function(name):
    print(f"进程 {name} 正在执行")
    sleep(20)

if __name__ == "__main__":
    # 创建一个进程对象，target指定要执行的函数，args传递参数
    process = Process(target=worker_function, args=("进程1",))
    process2 = Process(target=worker_function, args=("进程2",))

    # 启动进程
    process.start()
    process2.start()

    # 进程的name
    print(process.name)
    print(process2.name)

    # 进程的pid
    print(process.pid)
    print(process2.pid)

    # 进程的状态
    print(process.is_alive())
    print(process2.is_alive())

    # print(os.getpid())
    # 父进程的pid,主进程的父进程
    print(os.getppid())



    # 等待进程执行完毕
    process.join()
    process2.join()

    print("进程执行完毕")
    # 进程的状态
    print(process.is_alive())
    print(process2.is_alive())

    print("主进程结束")